package com.itcam.cli.command;

import cn.hutool.core.bean.BeanUtil;
import com.itcam.generator.MainGenerator;
import com.itcam.model.MainTemplateConfig;
import lombok.Data;
import picocli.CommandLine;
import picocli.CommandLine.Option;
import picocli.CommandLine.Command;

import java.util.concurrent.Callable;

/**
 * @author : Cammy.Wu
 * Description : 生成文件
 */

/**
 * 表示生成代码的命令类。
 * 该类实现了 Callable 接口，用于执行生成代码的操作。
 */
@Command(name = "generate", description = "生成代码", mixinStandardHelpOptions = true)
@Data
public class GenerateCommand implements Callable<Integer> {

    /**
     * 是否循环生成代码的选项。
     * 该选项可以通过命令行参数 `-1` 或 `--loop` 来设置。
     * 选项的arity为`0..1`，表示可以不设置或设置一次。
     * 选项是交互式的，并且会回显用户输入。
     */
    @Option(names = {"-l", "--loop"}, arity = "0..1", description = "是否循环", interactive = true, echo = true)
    private boolean loop;

    /**
     * 代码作者的选项。
     * 该选项可以通过命令行参数 `-a` 或 `--author` 来设置。
     * 选项的arity为`0..1`，表示可以不设置或设置一次。
     * 选项是交互式的，并且会回显用户输入。
     * 默认值为 "cammy"。
     */
    @Option(names = {"-a", "--author"}, arity = "0..1", description = "作者", interactive = true, echo = true)
    private String author = "cammy";

    /**
     * 输出文本的选项。
     * 该选项可以通过命令行参数 `-o` 或 `--outputText` 来设置。
     * 选项的arity为`0..1`，表示可以不设置或设置一次。
     * 选项是交互式的，并且会回显用户输入。
     * 默认值为 "sum = "。
     */
    @Option(names = {"-o", "--outputText"}, arity = "0..1", description = "输出文本", interactive = true, echo = true)
    private String outputText = "sum = ";

    /**
     * 执行生成代码的操作。
     * 该方法将当前对象的属性复制到 `MainTemplateConfig` 对象中，
     * 并调用 `MainGenerator.doGenerate` 方法来生成代码。
     *
     * @return 执行结果，0 表示成功
     * @throws Exception 如果生成代码过程中发生异常
     */
    @Override
    public Integer call() throws Exception {
        // 创建一个新的 MainTemplateConfig 对象
        MainTemplateConfig mainTemplateConfig = new MainTemplateConfig();
        // 将当前对象的属性复制到 mainTemplateConfig 对象中
        BeanUtil.copyProperties(this, mainTemplateConfig);
        // 打印配置信息
        System.out.println("配置信息：" + mainTemplateConfig);
        // 调用 MainGenerator.doGenerate 方法生成代码
        MainGenerator.doGenerate(mainTemplateConfig);
        // 返回执行结果，0 表示成功
        return 0;
    }
}

